class left {
    static of(value) {
        return new left(value)
    }

    constructor(value) {
        this.value = value
    }

    map(fn) {
        return this
    }
}

class right {
    static of(value) {
        return new right(value)
    }

    constructor(value) {
        this.value = value
    }

    map(fn) {
        return right.of(fn(this.value))
    }
}

// let result1 = left.of(22).map((res) => {
//     return res * 2
// })
// let result2 = right.of(22).map((res) => {
//     return res * 1
// })
// console.log(result1)
// console.log(result2)

function parseJSON(str) {
    try {
        return right.of(JSON.parse(str))
    } catch (e) {
        return left.of({error: e.message})
    }
}

let res = parseJSON('{"name":"asd"}')
    .map((res) => {
        return res.name.toUpperCase()
    })
console.log(res)
